package com.xjc.system.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

/**
 * 徐锦程
 * 时间:2024-10-01 15:54
 * 描述:jwt工具类
 */
public class TokenUtils {

    private static final String SECRET_KEY = "7dacbee4d7c" +
            "026407150e4e8916a144fc289071dd74257f94ef46e46" +
            "bcfabbb39ef029f71bc99e0edc1aed5a4057e10fb37040" +
            "9818c6e3f811a32c471966c943"; // 密钥
    private static final long EXPIRATION_TIME = 86400000; // 1天有效期

    /**
     * 生成JWT令牌
     *
     * @param id 用户id
     * @return JWT令牌
     */
    public static String generateToken(Integer id) {
        return Jwts.builder()
                .setSubject(String.valueOf(id))
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                .compact();
    }
    /**
     * 生成JWT令牌
     *
     * @param subject 唯一信息
     * @return JWT令牌
     */
    public static String generateToken(String subject) {
        return Jwts.builder()
                .setSubject(subject)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                .compact();
    }
    /**
     * 解析JWT令牌并返回主题
     *
     * @param token 待解析的JWT令牌
     * @return 如果令牌解析成功，则返回Claims对象，否则返回null
     */
    public static Claims parseToken(String token) {
        try {
            return Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 检查令牌是否有效
     *
     * @param token 待检查的JWT令牌
     * @return 如果令牌有效，则返回true，否则返回false
     */
    public static boolean isTokenValid(String token) {
        Claims claims = parseToken(token);
        return claims != null && !claims.getExpiration().before(new Date());
    }
}
